package com.test25_常用类2;

import org.junit.Test;

import java.util.Base64;

/**
 * Base64加密与解密
 * JDK1.8之后
 */
public class Demo01_Base64 {

    @Test
    public void test1() {
        String message = "www.yootk.com";
        Base64.Encoder encoder = Base64.getEncoder();   // 加密工具类
        byte[] encodeData = encoder.encode(message.getBytes());
        System.out.println("【加密后的数据】" + new String(encodeData));

        Base64.Decoder decoder = Base64.getDecoder();   // 解密工具类
        byte[] decodeData = decoder.decode(encodeData);
        System.out.println("【解密后的数据】" + new String(decodeData));
    }

    /**
     * 使用自定义加密、解密
     * 为了保证程序的安全性，执行多次加密和解密
     */
    @Test
    public void test2() {
        String message = "www.yootk.com";
        String encodeData = PasswordUtil.encrypt(message);
        System.out.println(encodeData);
        String decodeData = PasswordUtil.decrypt(encodeData);
        System.out.println(decodeData);
    }
}

/**
 * 自定义加密处理类
 */
class PasswordUtil {
    private static final int REPEAT = 5;    // 重复加密次数
    private static final String SALT = "edu.yootk.com"; // 追加操作盐值

    private PasswordUtil() {
    }

    /** 加密 */
    public static String encrypt(String str) {
        String encodeData = "{" + SALT + "}" + str; // 处理要加密的数据
        Base64.Encoder encoder = Base64.getEncoder();
        for (int x = 0; x < REPEAT; x++) {  // 多次加密
            encodeData = encoder.encodeToString(encodeData.getBytes());
        }
        return encodeData;
    }

    /** 解密 */
    public static String decrypt(String str) {
        Base64.Decoder decoder = Base64.getDecoder();
        byte[] data = str.getBytes();
        for (int x = 0; x < REPEAT; x++) {  // 多次解密
            data = decoder.decode(data);
        }
        String decodeData = new String(data);   // 包含有盐值的数据
        return decodeData.substring(("{" + SALT + "}").length());
    }
}
